#include "message.hpp"
#include "net.hpp"
#include "dispatcher.hpp"
#include <thread>

// int main()
// {
//     myrpc::RpcRequest::ptr rrp = myrpc::MessageFactory::create<myrpc::RpcRequest>();
//     // Json::Value parma;
//     // parma["num1"] = 11;
//     // parma["num2"] = 22;
//     // rrp->setMethod("Add");
//     // rrp->setParams(parma);
//     // std::string str = rrp->serialize();
//     // std::cout << str << std::endl; 

//     // myrpc::BaseMessage::ptr bmp = myrpc::MessageFactory::create(myrpc::MType::REQ_RPC);
//     // bool ret = bmp->unserialize(str);
//     // if(ret == false)
//     //     return -1;
//     // ret = bmp->check();
//     // if(ret == false)
//     //     return -1;
//     // myrpc::RpcRequest::ptr rrp2 = std::dynamic_pointer_cast<myrpc::RpcRequest>(bmp);
//     // std::cout << rrp2->method() << std::endl;
//     // std::cout << rrp2->params()["num1"].asInt() << std::endl;
//     // std::cout << rrp2->params()["num2"].asInt() << std::endl;

    
//     return 0;
// }

// 丐版
// void onRpcResponse(const myrpc::BaseConnection::ptr& conn, myrpc::BaseMessage::ptr& msg)
// {
//     std::cout << "收到了Rpc响应";
//     std::string body = msg->serialize();
//     std::cout << body << std::endl;
// }
// void onTopicResponse(const myrpc::BaseConnection::ptr& conn, myrpc::BaseMessage::ptr& msg)
// {
//     std::cout << "收到了Topic响应";
//     std::string body = msg->serialize();
//     std::cout << body << std::endl;
// }
// int main()
// {
//     auto dispather = std::make_shared<myrpc::Dispatcher>();

//     dispather->registerHandler(myrpc::MType::RSP_RPC, onRpcResponse);   // 注册映射关系
//     dispather->registerHandler(myrpc::MType::RSP_TOPIC, onTopicResponse);

//     auto client = myrpc::ClientFactory::create("127.0.0.1", 9090);
//     auto message_cb = std::bind(&myrpc::Dispatcher::onMessage, dispather.get(), 
//         std::placeholders::_1, std::placeholders::_2);
//     client->setMessageCallback(message_cb);//?

//     client->connect();
//     // RPC
//     auto rpc_rsp = myrpc::MessageFactory::create<myrpc::RpcRequest>();
//     rpc_rsp->setId("11111");
//     rpc_rsp->setMType(myrpc::MType::REQ_RPC);
//     rpc_rsp->setMethod("Add");
//     Json::Value param;
//     param["num1"] = 11;
//     param["num2"] = 22;
//     rpc_rsp->setParams(param);
//     client->send(rpc_rsp);
//     //TOPIC
//     auto topic_rsp = myrpc::MessageFactory::create<myrpc::TopicRequest>();
//     topic_rsp->setId("22222");
//     topic_rsp->setMType(myrpc::MType::REQ_TOPIC);
//     topic_rsp->setOptype(myrpc::TopicOptype::TOPIC_CREATE);
//     topic_rsp->setTopicKey("news");
//     client->send(topic_rsp);

//     std::this_thread::sleep_for(std::chrono::seconds(10));
//     client->shutdown();
//     return 0;
// }

// 高配版
// myrpc::BaseMessage::ptr& msg：用子类对象类型才可以更加清晰的访问所有内容，但这里是基类对象
// void onRpcResponse(const myrpc::BaseConnection::ptr& conn, myrpc::RpcResponse::ptr& msg)
// {
//     // 可以将基类强转为子类，也可获取所有参数
//     // 但是这样做 会增加用户的使用成本
//     // auto rpc_req = std::dynamic_pointer_cast<myrpc::RpcResponse>(msg);
//     std::cout << "收到了Rpc响应";
//     // std::string body = rpc_req->serialize();
//     std::string body = msg->serialize();
//     std::cout << body << std::endl;
// }
// void onTopicResponse(const myrpc::BaseConnection::ptr& conn, myrpc::TopicResponse::ptr& msg)
// {
//     std::cout << "收到了Topic响应";
//     std::string body = msg->serialize();
//     std::cout << body << std::endl;
// }
// int main()
// {
//     auto dispather = std::make_shared<myrpc::Dispatcher>();

//     dispather->registerHandler<myrpc::RpcResponse>(myrpc::MType::RSP_RPC, onRpcResponse);   // 注册映射关系
//     dispather->registerHandler<myrpc::TopicResponse>(myrpc::MType::RSP_TOPIC, onTopicResponse);

//     auto client = myrpc::ClientFactory::create("127.0.0.1", 9090);
//     auto message_cb = std::bind(&myrpc::Dispatcher::onMessage, dispather.get(), 
//         std::placeholders::_1, std::placeholders::_2);
//     client->setMessageCallback(message_cb);//?

//     client->connect();
//     // RPC
//     auto rpc_rsp = myrpc::MessageFactory::create<myrpc::RpcRequest>();
//     rpc_rsp->setId("11111");
//     rpc_rsp->setMType(myrpc::MType::REQ_RPC);
//     rpc_rsp->setMethod("Add");
//     Json::Value param;
//     param["num1"] = 11;
//     param["num2"] = 22;
//     rpc_rsp->setParams(param);
//     client->send(rpc_rsp);
//     //TOPIC
//     auto topic_rsp = myrpc::MessageFactory::create<myrpc::TopicRequest>();
//     topic_rsp->setId("22222");
//     topic_rsp->setMType(myrpc::MType::REQ_TOPIC);
//     topic_rsp->setOptype(myrpc::TopicOptype::TOPIC_CREATE);
//     topic_rsp->setTopicKey("news");
//     client->send(topic_rsp);

//     std::this_thread::sleep_for(std::chrono::seconds(10));
//     client->shutdown();
//     return 0;
// }